#include <stdio.h>
#include <stdlib.h>

typedef int ElemSet; /* 默认元素为整数*/

/* 算法10-2：希尔排序 ShellSort(a,l,r) */
void ShellSort(ElemSet *a, int l, int r) {
    int d[] = {260609, 146305, 64769, 36289,
               16001, 8929, 3905, 2161, 929,
               505, 209, 109, 41, 19, 5, 1, 0
              }; /* Sedgewick增量序列 */
    int ld, n, m, i, j;
    ElemSet t;

    ld = 16; /* Sedgewick增量序列长度 */
    n = r - l + 1; /* 待排序列长度 */
    for (m = 0; d[m] >= n; m++) ; /* 保证最大增量小于待排序列长度 */
    for (; m < ld; m++) {
        for (i = l + d[m]; i <= r; i++) {
            t = a[i]; /* 当前待插入的元素 */
            for (j = i; j >= (l + d[m]); j -= d[m]) {
                if (a[j - d[m]] > t) { /* 若不是插入位置 */
                    a[j] = a[j - d[m]]; /* 位移 */
                } else {
                    break; /* 找到插入的位置 */
                }
            }
            a[j] = t; /* 插入 */
        }
    }
}
/* 算法10-2 结束 */

int main(void) {
    ElemSet *a; /* 数组a的下标从0开始 */
    int n, i;

    scanf("%d", &n);
    a = (ElemSet *)malloc(sizeof(ElemSet) * n);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    ShellSort(a, 0, n - 1);
    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }

    return 0;
}